/**
 * Generali Solutions d'assurances - Tous droits rï¿½servï¿½s &copy; 2007 - 2010
 */
package fr.generali.accueilclient.referentiel.assembler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;

import fr.generali.accueilclient.produit.param.ITableProduit;
import fr.generali.accueilclient.produit.param.builder.TableProduitBuilder;
import fr.generali.accueilclient.referentiel.ReferentielEnum;
import fr.generali.accueilclient.table.param.ITableParam;
import fr.generali.accueilclient.table.param.builder.TableParamBuilder;
import fr.generali.accueilclient.utils.tuple.Couple;
import fr.generali.refservcommuns.rce.referentiel.produits.list.produit.DTOProduit;

/**
 * @author ebrouillard
 */

public class ListProduits2MapTableProduitSanteConverter implements
                Converter<List<DTOProduit>, Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>> {

    private String libelleProduitTypeSante;

    public ListProduits2MapTableProduitSanteConverter(String libelleProduitTypeSante) {
        this.libelleProduitTypeSante = libelleProduitTypeSante;
    }

    /**
     * {@inheritDoc}
     */
    public Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> convert(List<DTOProduit> input) {
        Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> couple = null;

        couple = buildCouple(ReferentielEnum.LIBELLE_PRODUIT_TYPE_SANTE, input);

        return couple;
    }

    /**
     * Construit le couple (rï¿½fï¿½rentiel, liste de valeurs) quand on prend toutes
     * les valeurs renvoyï¿½es par le service
     * 
     * @param referentiel le rï¿½fï¿½rentiel
     * @param input un {@link DTOProduit} fourni par le service
     * @return le couple (rï¿½fï¿½rentiel, liste de valeurs)
     */
    private Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> buildCouple(ReferentielEnum referentiel,
                    List<DTOProduit> input) {
        Map<ITableParam, ITableProduit> liste = buildListe(input);
        return new Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>(referentiel, liste);
    }

    /**
     * Construit la liste des rï¿½fï¿½rences quand on les prend toutes
     * 
     * @param input un {@link DTOProduit} fourni par le service
     * @return la liste des rï¿½fï¿½rences
     */
    private Map<ITableParam, ITableProduit> buildListe(List<DTOProduit> input) {
        List<DTOProduit> produitsListe = input;
        Map<ITableParam, ITableProduit> liste = new HashMap<ITableParam, ITableProduit>(produitsListe.size());
        for (int i = 0; i < produitsListe.size(); i++) {

            DTOProduit produit = produitsListe.get(i);

            if (StringUtils.equalsIgnoreCase(libelleProduitTypeSante, produit.getNomCommercial())) {

                ITableProduit tableProduit =
                                TableProduitBuilder.tableProduit().buildCode(produit.getCode())
                                                .buildCodeCompagnie(produit.getCodeCompagnie())
                                                .buildCodeSystemeOrigine(produit.getCodeSystemeOrigine())
                                                .buildNomCommercial(produit.getNomCommercial()).build();

                ITableParam tableParam =
                                TableParamBuilder.tableParam().buildCode(produit.getCode())
                                                .buildSystemOrigine(produit.getCodeSystemeOrigine()).build();

                liste.put(tableParam, tableProduit);
            }
        }
        return liste;
    }
}
